package utils;

import java.util.Scanner;

public class Utility {

    private static Scanner scanner = new Scanner(System.in);

    /**
     * 读取键盘输入的一个菜单选项，值：1-5的范围
     * @return 1-5
     */
    public static char readMenuSelection() {

        char c;
        for (;;) {
            String str = readKeyBoard(1, false);
            c = str.charAt(0);
            if (c != '1' && c != '2' &&
            c != '3' && c != '4' && c != '5') {
                System.out.println("选择错误，请重新输入:");
            } else {
                break;
            }
        }
        return c;
    }

    /**
     * 读取键盘输入的一个字符
     *
     * @return 一个字符
     */
    public static char readChar() {
        String str = readKeyBoard(1, false);
        return str.charAt(0);

    }

    /**
     * 读取键盘输入的一个字符，如果直接回车，则返回指定的默认值；否则返回输入的那个字符
     * @param defaultVaule 指定的默认值
     * @return 默认值或输入的字符
     */
    public static char readChar(char defaultVaule) {
        String s = readKeyBoard(1, true);
        return s.length() == 0 ? defaultVaule : s.charAt(0);
    }

    /**
     * 读取键盘输入的整型，长度小于2位
     * @return 整数
     */
    public static int readInt() {
        int n;
        for (;;) {
            String s = readKeyBoard(10, false); //一个整数，长度<=10位
            try {
                n = Integer.parseInt(s);
                break;
            } catch (NumberFormatException e) {
                System.out.println("数字输入错误，请重新输入：");
            }
        }
        return n;
    }

    /**
     * 读取键盘输入的整数或者默认值，如果直接回车，则返回默认值，否则返回输入的整数
     * @param defaultValue 指定的默认值
     * @return 整数或默认值
     */
    public static int readInt(int defaultValue) {
        int n;

        for(;;) {
            String s = readKeyBoard(10, true);
            if (s.equals("")) {
                return defaultValue;
            }
            try {
                n = Integer.parseInt(s);
                break;
            } catch (NumberFormatException e) {
                System.out.println("数字输入错误，请重新输入：");
            }
        }
        return n;
    }

    /**
     * 读取键盘输入的指定长度的字符串
     * @param limit
     * @return
     */
    public static String readString(int limit) {
        return readKeyBoard(limit, false);
    }

    /**
     * 读取键盘输入的指定长度的字符串或默认值，如果直接回车，返回默认值，否则返回字符串
     * @param limit
     * @param defaultValue
     * @return
     */
    public static String readString(int limit, String defaultValue) {

        String s = readKeyBoard(limit, true);
        return s.equals("") ? defaultValue : s;

    }

    /**
     * 读取键盘输入的确认选项，Y或N
     * 将小的功能封装到一个方法中
     * @return Y\N
     */
    public static char readConfrimSelection(String message) {
        System.out.println(message);
        char c;
        for (;;) {
            //接受字符，转成大写
            String s = readKeyBoard(1, false).toUpperCase();
            c = s.charAt(0);
            if (c == 'Y' || c == 'N') {
                break;
            } else {
                System.out.println("输入错误，请重新输入");
            }
        }
        return c;
    }
    /**
     * 读取一个字符串
     * @param limit 读取的长度
     * @param blankReturn   如果为true,表示可以读取空字符串
     *                      如果为false,不能读取空字符串
     *
     * 如果输入为空，或者输入大于limit的长度，就会提示重新输入
     * @return
     */
    private static String readKeyBoard(int limit, boolean blankReturn) {

        String line = "";

        while (scanner.hasNextLine()) {
            line = scanner.nextLine();

            if (line.length() == 0) {
                if (blankReturn) return line;
                else continue;
            }
            if (line.length() < 1 || line.length() > limit) {
                System.out.println("输入长度(不能大于" + limit + ")错误，请重新输入：");
                continue;
            }
            break;
        }
        return line;
    }
}
